<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>The PostgreSQL Rule System</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REV="MADE"
HREF="mailto:pgsql-docs@postgresql.org"><LINK
REL="HOME"
TITLE="PostgreSQL 9.1.2 Documentation"
HREF="index.html"><LINK
REL="UP"
TITLE="Overview of PostgreSQL Internals"
HREF="overview.html"><LINK
REL="PREVIOUS"
TITLE="The Parser Stage"
HREF="parser-stage.html"><LINK
REL="NEXT"
TITLE="Planner/Optimizer"
HREF="planner-optimizer.html"><LINK
REL="STYLESHEET"
TYPE="text/css"
HREF="stylesheet.css"><META
HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=ISO-8859-1"><META
NAME="creation"
CONTENT="2011-12-01T22:07:59"></HEAD
><BODY
CLASS="SECT1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="5"
ALIGN="center"
VALIGN="bottom"
><A
HREF="index.html"
>PostgreSQL 9.1.2 Documentation</A
></TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
TITLE="The Parser Stage"
HREF="parser-stage.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
HREF="overview.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="60%"
ALIGN="center"
VALIGN="bottom"
>Chapter 44. Overview of PostgreSQL Internals</TD
><TD
WIDTH="20%"
ALIGN="right"
VALIGN="top"
><A
TITLE="Planner/Optimizer"
HREF="planner-optimizer.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="RULE-SYSTEM"
>44.4. The <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> Rule System</A
></H1
><P
>    <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> supports a powerful
    <I
CLASS="FIRSTTERM"
>rule system</I
> for the specification
    of <I
CLASS="FIRSTTERM"
>views</I
> and ambiguous <I
CLASS="FIRSTTERM"
>view updates</I
>.
    Originally the <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
>
    rule system consisted of two implementations:

    <P
></P
></P><UL
><LI
><P
>       The first one worked using <I
CLASS="FIRSTTERM"
>row level</I
> processing and was
       implemented deep in the <I
CLASS="FIRSTTERM"
>executor</I
>. The rule system was
       called whenever an individual row had been accessed. This
       implementation was removed in 1995 when the last official release
       of the <SPAN
CLASS="PRODUCTNAME"
>Berkeley Postgres</SPAN
> project was
       transformed into <SPAN
CLASS="PRODUCTNAME"
>Postgres95</SPAN
>.
      </P
></LI
><LI
><P
>       The second implementation of the rule system is a technique
       called <I
CLASS="FIRSTTERM"
>query rewriting</I
>.
       The <I
CLASS="FIRSTTERM"
>rewrite system</I
> is a module
       that exists between the <I
CLASS="FIRSTTERM"
>parser stage</I
> and the
       <I
CLASS="FIRSTTERM"
>planner/optimizer</I
>. This technique is still implemented.
      </P
></LI
></UL
><P>
   </P
><P
>    The query rewriter is discussed in some detail in
    <A
HREF="rules.html"
>Chapter 37</A
>, so there is no need to cover it here.
    We will only point out that both the input and the output of the
    rewriter are query trees, that is, there is no change in the
    representation or level of semantic detail in the trees.  Rewriting
    can be thought of as a form of macro expansion.
   </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="parser-stage.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="planner-optimizer.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>The Parser Stage</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="overview.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Planner/Optimizer</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>